#/bin/bash
convert_hex() {
    local input_str=$1
    local output_file=$2

    # 删除 "@********" 和所有空白字符
    local cleaned_str=$(echo "$input_str" | sed 's/@........//' | tr -d '[:space:]')

    # 以四个字节为一组，交换每组内的字节，并输出到文件
    local swapped_str=$(echo $cleaned_str | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g')

    # 以16个字节为一组，交换组内的每4个字节，并输出到文件；如果不满足16个字节，不足的部分补充00000013直到满足16个字节
    # 获取原始字符串长度
    original_length=${#swapped_str}
    # 判断original_length / 2是否为4的倍数，如果不是则报错并退出
    if [ $((original_length % 8)) -ne 0 ]; then
        echo "Error: input file '$input_file' is not a valid verilog simulation input file"
        exit 1
    fi
    # 计算需要补充的指令数
    padding_length=$(( 4- (original_length / 8)%4 ))
    # 在原始字符串末尾添加指定数量的指令
    if [ $padding_length -eq 4 ]; then
        padded_str=$swapped_str
    else
        padded_str=$swapped_str
        for i in $(seq 1 $padding_length); do
            padded_str=$padded_str"00000013"
        done
    fi
    
    # 将补充后的字符串按照每16个字节进行交换，并保存到文件
    swapped_str_all=$(echo "$padded_str" | sed 's/\(........\)\(........\)\(........\)\(........\)/\4\3\2\1/g')


    # 每32个字符后添加换行符
    local formatted_str=$(echo $swapped_str_all | sed 's/.\{32\}/&\n/g')

    # 输出到文件
    echo "$formatted_str" > "$output_file"
}

# Usage: ./tool.sh a.out -o rv_imm.dat
# 检查是否有sed命令
if ! command -v sed &> /dev/null; then
    echo "Error: sed command not found"
    exit 1
fi
# 检查是否有seq命令
if ! command -v seq &> /dev/null; then
    echo "Error: seq command not found"
    exit 1
fi

# 检查参数
if [ $# -lt 1 ]; then
    echo "Usage: $0 <input_file> [-o <output_file>]"
    exit 1
fi

# 检查输入文件是否存在
if [ ! -f "$1" ]; then
    echo "Error: input file '$1' does not exist"
    exit 1
fi

# 检查输入文件是否为verilog仿真输入文件
if ! grep -q '@' "$1"; then
    echo "Error: input file '$1' is not a verilog simulation input file"
    exit 1
fi

# 检查输出文件是否存在,如果存在则覆盖
if [ $# -eq 3 ] && [ -f "$3" ]; then
    echo "Warning: output file '$3' already exists, will be overwritten"
fi

# 读取参数，输出文件默认为 rv_mem.dat
input_file=$1
output_file="rv_mem.dat"
if [ $# -eq 3 ]; then
    output_file=$3
fi

# 读取输入文件
input_str=$(cat "$input_file")

# 转换并输出到文件
convert_hex "$input_str" "$output_file"

